package myServer.processor;

import component.userInformation.UserAttribute;
import myServer.session.ServerSession;
import myServer.session.SessionMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import protobuf.ProtoInstance;
import protobuf.Serialization.LoginResponseMsgConverter;
import protobuf.protoClass.ProtoMsg;

/**
 * <pre>
 *     处理客户端发送过来的 登录请求 信息。
 *     服务器端处理完成，向客户端发送 响应信息
 * </pre>
 */

@Service("LoginProcessor")
public class LoginProcessor implements ServerProcessor {

    @Autowired
    LoginResponseMsgConverter loginResponseMsgConverter;

    @Override
    public ProtoMsg.HeadType type() {
        return ProtoMsg.HeadType.LOGIN_REQUEST;
    }

    /**
     * 服务器端对客户端的 登录请求信息进行处理、响应
     *
     * @param serverSession 服务器端
     * @param protoMessage  客户端发送过来的登录请求信息
     */
    @Override
    public boolean perform(ServerSession serverSession, ProtoMsg.Message protoMessage) {
        //获取 消息序列号
        long sequence = protoMessage.getSequence();
        //获取 登录请求
        ProtoMsg.LoginRequest loginRequest = protoMessage.getLoginRequest();
        //设置用户登录信息
        UserAttribute userAttribute = UserAttribute.makeUserAttribute(loginRequest);
        //对用户进行身份合法性验证
        boolean isValidUser = checkUser(userAttribute);
        if (!isValidUser) {
            // NO_TOKEN -> 没有授权码
            ProtoInstance.LoginResponseStateCodeEnum resultCode =
                    ProtoInstance.LoginResponseStateCodeEnum.NO_TOKEN;
            //生成 ProtoMsg.Message  LoginResponse 登录响应信息 登录失败
            ProtoMsg.Message response = loginResponseMsgConverter.build(resultCode, sequence, "-1");
            //发送登录失败响应信息
            serverSession.writeAndFlush(response);
            return false;
        }
        //设置用户信息
        serverSession.setUserAttribute(userAttribute);
        //将 ServerSession绑定到 Channel
        serverSession.bindChannelWithServerSession();
        //SUCCESS -> 登陆成功
        ProtoInstance.LoginResponseStateCodeEnum resultCode =
                ProtoInstance.LoginResponseStateCodeEnum.SUCCESS;
        //生成登陆成功 响应信息
        ProtoMsg.Message response =
                loginResponseMsgConverter.build(resultCode, sequence, serverSession.getServerSessionID());
        //发送登录成功响应信息
        serverSession.writeAndFlush(response);
        return true;
    }

    /**
     * 用户身份合法性验证
     */
    private boolean checkUser(UserAttribute user) {

        if (SessionMap.instance().isLoginByOtherPlatform(user)) {
            return false;
        }
        /**
         * 校验用户,比较耗时的操作
         * 方法1：调用远程用户 restfull 校验服务
         * 方法2：调用数据库接口校验
         *
         * 可以调用 SSL证书验证
         */
        return true;
    }

}
